Aller au contenu principal

Tri par insertion

Principe :

On trie les éléments un par un, en prenant chaque élément et en le plaçant à la bonne position parmi ceux déjà triés.
À chaque itération, on prend un élément de la partie non triée et on l’insère à la bonne position dans la partie triée.

Complexité :

  • Meilleur cas : O(n) (déjà trié)
  • Pire et moyen cas : O(n²)
  • Mémoire : O(1) (tri en place)

Code :

public static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int key = arr[i]; // L'élément courant à placer
int j = i - 1; // On regarde l'élément à gauche

// Tant que l'élément à gauche est plus grand, on le décale d'une case à droite
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j]; // Décale l'élément vers la droite
j--; // Regarde encore plus à gauche
}
// On a trouvé la bonne place : on insère l'élément
arr[j + 1] = key;
}
}

Exemple pas à pas avec [5, 3, 8, 1, 4]

On parcourt le tableau de gauche à droite. Pour chaque élément, on le recule vers la gauche jusqu'à sa bonne position.

ÉtapeÉlément pris (key)ActionRésultat
DépartLe premier élément est déjà "trié" seul[5, 3, 8, 1, 4]
i=1key = 33 < 5 → on décale 5 à droite, on place 3[3, 5, 8, 1, 4]
i=2key = 88 > 5 → rien à décaler, on place 8[3, 5, 8, 1, 4]
i=3key = 11 < 8, 1 < 5, 1 < 3 → on décale tout, on place 1 au début[1, 3, 5, 8, 4]
i=4key = 44 < 8, 4 < 5 → on décale 8 et 5, on place 4 après 3[1, 3, 4, 5, 8]

Détail de l'étape i=3 (la plus importante) :

Main triée : [3, 5, 8] key = 1
[3, 5, 8, 8] ← on a décalé 8
[3, 5, 5, 8] ← on a décalé 5
[3, 3, 5, 8] ← on a décalé 3
[1, 3, 5, 8] ← on insère 1 à la position j+1 = 0

Astuce mentale : pour chaque élément, tu le recules vers la gauche tant qu'il est plus petit que son voisin, jusqu'à ce qu'il soit à sa bonne position.

À noter :

  • Excellent pour illustrer le tri étape par étape
  • Facile à tracer à la main

Youtube

https://www.youtube.com/watch?v=JU767SDMDvA

Comparatif

TriComplexité moyenneMémoire
Insertion SortO(n²)O(1)
Heap SortO(n log n)O(1)
Tri indirectO(n log n)O(n)